<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 闭包会产生的问题：内存泄漏
      function count() {
        let i = 0;
        return function () {
          i++;
          console.log(`调用了${i}次`);
        };
      }
      const fn = count();
      // ==>
      // const fn = function(){
      //         i++
      //         console.log(`调用了${i}次`)
      //     }
      fn();

      // 标记清除法 ： 从一组根元素开始，
      // 或者说从全局作用域出发，找到了这个i变量，能访问到这个i变量，把它标记为活动对象
      // 所以不会GC程序清理掉

      // 本来，我们调用fn()后，按理说， i是函数count里面的变量，局部变量，执行完后应该销毁
      // 但是现在，因为 i 变量和内部的函数function形成了闭包。i变量没有被销毁，所以，造成了内存泄漏。

      // 有一个变量因该被回收但是没有被回收  内存泄漏

      //====================== 理解记忆面试题  ==================
      // 闭包的特性(作用)
      // ==> 通过闭包，我们可以让外部访问到函数内部的变量，同时，实现数据的私有化。
      // 闭包产生的问题：内存泄漏

      // 闭包的实际应用
      // 节流 throttle  减少事件执行的频率
      // 防抖 debounce  你先抖动着，什么时候停了，我再执行事件
    </script>
  </body>
</html>
